package com.example.design.demo.clone;

/**
 * @author lfj
 * @date 2023/11/24 17:15
 * @description 原型模式通用源码
 * 优点：1、原型模式是在内存二进制流的拷贝，要比直接new一个对象性能好很多，特别是要在一
 * 个循环体内产生大量的对象时，原型模式可以更好地体现其优点。
 * 2、直接在内存中拷贝，构造函数是不会执行的，优点就是减少了约束，缺点也是减少了约束。
 *
 * 使用场景：
 * 资源优化场景：类初始化需要消化非常多的资源，这个资源包括数据、硬件资源等。
 * 性能和安全要求的场景：通过new产生一个对象需要非常繁琐的数据准备或访问权限，则可以使用原型模式。
 * 一个对象多个修改者的场景：一个对象需要提供给其他对象访问，而且各个调用者可能都需要修改其值时，可以考虑
 * 使用原型模式拷贝多个对象供调用者使用。
 * 原型模式很少单独出现，一般是和工厂方法模式一起出现，通过clone的
 * 方法创建一个对象，然后由工厂方法提供给调用者。
 */
public class PrototypeClass01 implements Cloneable{
    public PrototypeClass01() {
        System.out.println("执行构造函数啦");
    }

    /**
     * 构造函数不会被执行
     */
    /**
     * 原型模式的使用场景
     * ●
     * 资源优化场景
     * 类初始化需要消化非常多的资源，这个资源包括数据、硬件资源等。
     * ●
     * 性能和安全要求的场景
     * 通过new产生一个对象需要非常繁琐的数据准备或访问权限，则可以使用原型模式。
     * ● 一
     * 个对象多个修改者的场景
     * 一
     * 个对象需要提供给其他对象访问，而且各个调用者可能都需要修改其值时，可以考虑
     * 使用原型模式拷贝多个对象供调用者使用。
     * 在实际项目中，原型模式很少单独出现，一般是和工厂方法模式一起出现，通过clone的
     * 方法创建一个对象，然后由工厂方法提供给调用者。原型模式已经与Java融为一体，大家可
     * 以随手拿来使用。
     *
     * 原型模式的核心是一个clone方法，通过该方法进行对象的拷贝，Java
     * 提供了一个Cloneable接口来标示这个对象是可拷贝的，为什么说是“标示”呢？翻开JDK的帮
     * 助看看Cloneable是一个方法都没有的，这个接口只是一个标记作用，在JVM中具有这个标记
     * 的对象才有可能被拷贝。那怎么才能从“有可能被拷贝”转换为“可以被拷贝”呢？方法是覆盖
     * clone()方法，是的，你没有看错是重写clone()方法
     */
    //覆写父类Object方法
    @Override
    public PrototypeClass01 clone(){
        PrototypeClass01 prototypeClass = null;
        try {
            prototypeClass = (PrototypeClass01)super.clone();
        } catch (CloneNotSupportedException e) {
            //异常处理
        }
        return prototypeClass;
    }


}
